package com.priox.sigar.jsf.datamodel;

import com.priox.sigar.dto.ReporteContext;
import com.priox.sigar.application.mappers.ReportePedidoPosicionMapper;
import com.priox.sigar.dto.RepPedidoPosicionCxADTO;
import org.apache.commons.lang.StringUtils;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by MATRIX-JAVA on 13/1/2015.
 */
public class LazyPosicionModel extends LazyDataModel<RepPedidoPosicionCxADTO> {

    ReportePedidoPosicionMapper reporteMapper;
    ReporteContext reporteContext;
    private List<RepPedidoPosicionCxADTO> dataList = new ArrayList<RepPedidoPosicionCxADTO>();

    public LazyPosicionModel(ReportePedidoPosicionMapper reporteMapper, ReporteContext reporteContext) {
        this.reporteMapper = reporteMapper;
        this.reporteContext = reporteContext;
    }

    private Integer calcularTamanioTotal() {
        Integer numeroNotificaciones = reporteMapper.total(reporteContext);
        return numeroNotificaciones < 500 ? numeroNotificaciones:500;
    }

    @Override
    public List<RepPedidoPosicionCxADTO> load(int first, int pageSize, String sortField,
                                              SortOrder sortOrder,
                                              Map<String,String> filters) {

        Map<String,String> map = new HashMap<String, String>();
        map.put("cantidadPosicion","CP.CANTIDAD_POSICION");
        map.put("total","1".equals(reporteContext.getTipoMonto())?"CP.MONTO_IMPORTE_VALORADO":"CP.MONTO_MONEDA_LOCAL");
        map.put("totalGeneral","1".equals(reporteContext.getTipoMonto())?"CP.MONTO_IMPORTE_VALORADO":"CP.MONTO_MONEDA_LOCAL");
        map.put("cantidadProvicionFactura","CP.CANTIDAD_PROV_FACTURA");
        map.put("cantidadCuentaContable","CP.CANTIDAD_CUENTA_CONTABLE");
        map.put("cantidadProvisionSinFactura","CP.CANTIDAD_PROV_SIN_FACTURA");
        map.put("cantidadFactura","CP.CANTIDAD_FACTURA");
        map.put("numeroPedido","CP.NUMERO_DOCUMENTO_COMPRA");

        if(StringUtils.isBlank(sortField)){
            reporteContext.setSortColumn("CP.NUMERO_DOCUMENTO_COMPRA");
        }else{
            reporteContext.setSortColumn(map.get(sortField));
        }

        if(sortOrder==null){
            reporteContext.setSortOrden("asc");
        }else{
            reporteContext.setSortOrden(sortOrder.name().startsWith("ASC") ? "asc" : "desc");
        }
        Integer totalSize= calcularTamanioTotal();
        int start = first;
        int end = first + pageSize;

        if(end> totalSize){
            end=totalSize;
        }
        reporteContext.setStart(start);
        reporteContext.setEnd(end);
        dataList = reporteMapper.find(reporteContext);
        setRowCount(totalSize);
        return dataList;
    }


    @Override
    public RepPedidoPosicionCxADTO getRowData(String rowKey) {
        for(RepPedidoPosicionCxADTO n : dataList) {
            if(n.getNumeroPedido().equals(rowKey))
                return n;
        }
        return null;
    }

    @Override
    public Object getRowKey(RepPedidoPosicionCxADTO n) {
        return n.getNumeroPedido();
    }

    @Override
    public void setRowIndex(int rowIndex) {
        if (rowIndex == -1 || getPageSize() == 0) {
            super.setRowIndex(-1);
        } else{

            super.setRowIndex(rowIndex % getPageSize());
        }

    }

}
